/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tamagochi.dao;

import br.com.tamagochi.bean.Tamagochi;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

/**
 *
 * Esta classe é responsavel por acessar os dados do objeto
 * carregando o estado atual do bicho virtual e salvando o estado em arquivo. 
 * 
 * @author Allan & Fabiana
 * @author Kamilla Cardoso
 */
public class TamagochiDao {
    
    private final String PADRAO = "config/padrao.properties";
    private final String SALVO = "config/salvo.properties";
    
    
    /**
     * Metodo que carrega o bicho vitual no seu estado padrão, 
     * atraves do uso de arquivos seram carregados as imagens do diterorio descrito como PADRAO ou SALVO
     * o metodo ainda dispoen de uma quebra de linha na propriedade de images decompondo cada linha em números individuais, 
     * formado os estados das imagens do tipo .gif. Para isso foi criada uma lista onde para dada indice de posição à 
     * uma lista acoplada a mesma.
     * Então o uso da classe StringTokenizer vai auxiliar de forma a captar as imagens em sua sequencia e adicionar a lista de imagens.
     * Formando assim a concepção de movimento do bicho virtual.
     * 
     * @see FileInputStream, StringTokenizer, Properties 
     * 
     * @exception IOException
     * 
     * @return Tamagochi
     */
    public Properties carregamentoEstadoPadrao(){
        Tamagochi tamagochi = null;
        Properties properties = new Properties();
        try {
            //cria um stream do arquivo de propriedades padrão.
            FileInputStream in = new FileInputStream(PADRAO);
            
            //carrega o  arquivo de propriedades padrão. 
            properties.load(in);
            
            //fecha o stream
            in.close();
            
            
            StringTokenizer st = new StringTokenizer((String)properties.get("images"),"::");
            
            List<List<Image>> images = new ArrayList<List<Image>>();
            
            while(st.hasMoreTokens()){
                StringTokenizer stFile = new StringTokenizer(st.nextToken(),"#");
                
                List<Image> image = new ArrayList<Image>();
                
                while(stFile.hasMoreTokens()){
                    
                    File f = new File(stFile.nextToken());

                    image.add(Toolkit.getDefaultToolkit().getImage(f.getAbsolutePath()));
                }
                
                images.add(image);
            }
            
            properties.put("lista.imagens",images);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return properties;
    }
    
    /**
     * Metodo responsavel por salvar em arquivo de propriedade 
     * atraves do diretorio definido no atributo SALVO.
     * 
     * @param p
     * 
     * @exception IOException
     */
    public void salvarEstado(Properties p , String path){
        
        try {
            FileOutputStream out  = new FileOutputStream(path);
            p.store(out, "");
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    public Properties carregaEstado(String path){
           
        Properties padrao = carregamentoEstadoPadrao();
        
        Properties properties = new Properties();
           
        try{   
            //cria um stream do arquivo de propriedades padrão.
            FileInputStream in = new FileInputStream(path);
            
            //carrega o  arquivo de propriedades padrão. 
            properties.load(in);
            
            //fecha o stream
            in.close();
            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        padrao.setProperty("sono", properties.getProperty("sono"));
        padrao.setProperty("saude", properties.getProperty("saude"));
        padrao.setProperty("fome", properties.getProperty("fome"));
        padrao.setProperty("felicidade", properties.getProperty("felicidade"));
        padrao.setProperty("idade", properties.getProperty("idade"));
        padrao.setProperty("peso", properties.getProperty("peso"));
        
        return padrao;
    }
    
    
}
